package cn.com.gridinfo.sooc.core.login.activity;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.afollestad.materialdialogs.MaterialDialog;
import com.jeremy.arad.Arad;
import com.jeremy.arad.utils.AnimUtil;
import com.jeremy.arad.utils.Log;
import com.jeremy.arad.utils.StringUtils;
import com.squareup.picasso.Picasso;

import java.util.List;
import java.util.Set;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import butterknife.OnTextChanged;
import cn.com.gridinfo.sooc.R;
import cn.com.gridinfo.sooc.base.BaseSoocActivity;
import cn.com.gridinfo.sooc.common.LocalMark;
import cn.com.gridinfo.sooc.core.home.activity.HomeActivity;
import cn.com.gridinfo.sooc.core.login.activity.forgetpwd.ForgetPwdActivity;
import cn.com.gridinfo.sooc.core.login.bean.NodeServerInfo;
import cn.com.gridinfo.sooc.core.login.bean.UserInfo;
import cn.com.gridinfo.sooc.core.login.common.CodeConst;
import cn.com.gridinfo.sooc.core.login.common.UserPreference;
import cn.com.gridinfo.sooc.core.login.dao.LoginDao;
import cn.com.gridinfo.sooc.utils.GetChannel;
import cn.com.gridinfo.sooc.utils.IntentUtil;
import cn.com.gridinfo.sooc.utils.MessageUtils;
import cn.com.gridinfo.sooc.utils.widget.ClearEditText;
import cn.com.jpushdemo.ExampleUtil;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;
import de.hdodenhof.circleimageview.CircleImageView;

/**
 * 登录界面
 *
 * @author lijie
 */
public class LoginActivity extends BaseSoocActivity {

    @InjectView(R.id.username)
    ClearEditText username;//账号控件
    @InjectView(R.id.password)
    ClearEditText password;//密码控件
    @InjectView(R.id.login_btn)
    Button loginBtn; //登录按钮

    @InjectView(R.id.login_header)
    CircleImageView loginHeader;//登录头像

    LoginDao loginDao;//登录DAO

    String account;//登录的账号
    String pwd;//登录的密码
    List<NodeServerInfo> nodeServerLists;//节点服务器列表

    NodeServerInfo nodeServerInfo;//当前节点服务器信息

    boolean isBindAlias;//是否要绑定设备
    // 返回键两次点击的时间间隔
    private long exitTime = 0;
    //实例化主 activity
//    public static LoginActivity instance = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
//        instance = this;
        ButterKnife.inject(this);
        loginDao = new LoginDao(this);
        loginBtn.setEnabled(false);

//        //设置页面点击退出标识
//        if(getIntent()!=null) {
//            Boolean logOut = getIntent().hasExtra("logOut") ? true : false;
//            if (logOut) {
//                setAlias(false);//设置设备别名为空,解除设备
//            }
//        }

//        username.setText("jnnjiang@qq.com");
//        password.setText("123456");
//        username.setText("13105229095");
//        password.setText("111111");
//        username.setText("soocyk02@sina.com");
//        password.setText("111111");
//        username.setText("18663882518");
//        password.setText("111111");
//        username.setText("13321111119");
//        password.setText("190661");

        if(!"".equals(Arad.preferences.getString(LocalMark.USER_HEADIMG.getName(),""))){
            Picasso.with(this).load(Arad.preferences.getString(LocalMark.USER_HEADIMG.getName())).resize(200,200).centerCrop().placeholder(R.mipmap.login_headig)
                    .error(R.mipmap.login_headig).into(loginHeader);
        }

        //如果用户登录帐号不为空则显示
        if(!"".equals(Arad.preferences.getString(LocalMark.USER_ACCOUNT.getName()))){
            username.setText(Arad.preferences.getString(LocalMark.USER_ACCOUNT.getName(),""));
        }


        //按键完成监听
        password.setImeOptions(EditorInfo.IME_ACTION_DONE);
        password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            public boolean onEditorAction(TextView v, int actionId,
                                          KeyEvent event){
                if (actionId == EditorInfo.IME_ACTION_DONE)
                {
                    if(validateNotNull()){
                        login();
                    }

                }
                return false;
            }
        });

    }

    @Override
    public String setupToolBarTitle() {
        return "登 录";
    }

    @Override
    public boolean setupToolBarLeftButton(ImageView leftButton) {
        leftButton.setImageResource(R.mipmap.close);
        return false;
    }

//    // 关闭登录页
//    @OnClick(R.id.toolbar_leftbtn)
//    void finisLoginPage() {
//        Intent intent = new Intent();
//        intent.putExtra("loginFlag", "noLogin");
//        setResult(Activity.RESULT_OK, intent);
//        finish();
//        AnimUtil.intentPushDown(this);
//    }

    //监听账号密码输入框 验证登录 账号密码不为空
    @OnTextChanged(value = {R.id.username, R.id.password}, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
    void textChaned() {

        String account = username.getText().toString().trim();//账号
        String pwd = password.getText().toString().trim();//密码
        //账号,或者密码有一个是空则登录按钮为不可点击状态
        if (StringUtils.isNull(account) || StringUtils.isNull(pwd)) {
            loginBtn.setEnabled(false);

        } else {
            //可登录
            loginBtn.setEnabled(true);

        }
    }

    //验证 账号密码
    private boolean validateNotNull(){
        String account = username.getText().toString().trim();//账号
        String pwd = password.getText().toString().trim();//密码
        //账号为空
        if(StringUtils.isNull(account)){
            username.requestFocus();
            return false;
        }
        //密码为空
        if(StringUtils.isNull(pwd)){
            password.requestFocus();
            return false;
        }

            return true;

    }

    // 点击登录
    @OnClick(R.id.login_btn)
    void login() {
        //MessageUtils.showImageShortToast(this, "登录");
        account = username.getText().toString().trim();//账号
        pwd = password.getText().toString().trim();//密码

        //登录获取服务器节点
        loginDao.getNodeServer(account);
        //设置登录按钮不可点
        setLoginBtnStatus( false);
    }

    //立即注册
    @OnClick(R.id.now_reg)
    void nowReg() {
//        MessageUtils.showImageShortToast(this, "立即注册");
        IntentUtil.intentSlidIn(this,SelectSchoolActivity.class,00);
    }

    //忘记密码
    @OnClick(R.id.forget_pwd)
    void forgetPwd() {
//        IntentUtil.intentSlidIn(this,ForgetPwdActivity.class,00);
        Intent intent=new Intent(this,ForgetPwdActivity.class);
        account= username.getText().toString().trim();//账号
        if (!StringUtils.isNull(account)){
            //如果账号不为空，直接传入找回密码的账号输入框
            intent.putExtra("account",account);
        }
        startActivity(intent);
        AnimUtil.intentSlidIn(this);

    }


    /**
     * 请求成功
     */
    @Override
    public void onRequestSuccess(int requestCode) {

        switch (requestCode) {
            case CodeConst.LOGIN_NODE_SERVER://登录获取节点服务器
                int serverCount = loginDao.getServerCount();//节点服务器数量0 未注册 1 默认该节点直接登录 >=2 弹出节点列表框选择节点登录
                //无节点
                if (serverCount == 0) {
                    Log.i("无服务器列表存在");
                    MessageUtils.showImageShortToast(this, "账号不存在");
                    //设置登录按钮可点
                    setLoginBtnStatus(true);
                    break;
                } else if (serverCount == 1) {
                    nodeServerLists = loginDao.getNodeServerList();//获取节点服务器 list
                    nodeServerInfo = nodeServerLists.get(0);//获取节点服务器信息
                    //设置服务器内容存入本地
                    setServerPreference();
                    //直接登录 密码未加密
                    loginDao.loginUser(account, pwd);
                } else {
                    nodeServerLists = loginDao.getNodeServerList();//获取节点服务器 list
//                    弹出节点列表对话框
                    new MaterialDialog.Builder(this).backgroundColorRes(R.color.white)
                            .title("选择学校").titleColorRes(R.color.color_666)
                            .items(getServerListFormat()).contentColorRes(R.color.color_666)
                            .itemsCallback(new MaterialDialog.ListCallback() {
                                @Override
                                public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
                                    nodeServerInfo = nodeServerLists.get(which);//获取节点服务器信息
//                                    MessageUtils.showShortToast(LoginActivity.this,which + ": " + text);
                                    //设置服务器内容存入本地
                                    setServerPreference();
                                    //直接登录 密码未加密
                                    loginDao.loginUser(account, pwd);
                                }
                            })
                            .cancelListener(new DialogInterface.OnCancelListener() {
                                @Override
                                public void onCancel(DialogInterface dialog) {
                                    //设置登录按钮可点
                                    setLoginBtnStatus(true);
                                }
                            })
                            .show();
                }

                break;

            case CodeConst.LOGIN_VALIDATE_LOGIN://登录
                //登录失败
                if (!loginDao.status.equals("0")) {
                    MessageUtils.showImageShortToast(this, loginDao.statusCode);
                    //设置登录按钮可点
                    setLoginBtnStatus(true);
                }
                //登录成功
                else {
                    //登录信息存入本地
                    if(!loginDao.getUserInfo().getUid().equals(Arad.preferences.getString(LocalMark.USER_UID.getName().toString()))){
                        //切换账号，清除我的消息保存在本地的时间标志
                        UserPreference.clearMsgPrefrence();
                        UserPreference.clearUserPrefrence();
                    }
                    setUserPreference(loginDao.getUserInfo());
                    //获取用户权限  是否游客身份 积分墙是否显示 广告是否显示 1 是 0 否
                    loginDao.getPermision(GetChannel.getChannelNo(this));//输入渠道号
                    MessageUtils.showRightImageShortToast(this,"登录成功");
                }
                break;

            case CodeConst.LOGIN_IS_PERMISION://获取用户权限  是否游客身份 积分墙是否显示 广告是否显示 1 是 0 否
//                MessageUtils.showImageShortToast(this,"获取用户权限");
                //不管成功与否都设置权限
                setPermisionPreference(loginDao.getUserInfo());
                try {
                    setAlias(true);//绑定设备
                    goToHome();
                } catch (Exception e) {
                    Log.d("绑定极光推送设备失败");
                    goToHome();
                }

                break;

            case CodeConst.LOGIN_JPUSH_BIND://绑定设备

                Log.d(loginDao.statusCode);
//                MessageUtils.showImageShortToast(this,loginDao.statusCode);

                break;

            case CodeConst.LOGIN_JPUSH_UNBIND://解绑设备
                if (loginDao.status.equals("0")) {
                    //解除绑定成功
                    Log.d("解除绑定设备成功");
                } else {
                    //解除绑定失败提示信息继
                    Log.i(loginDao.statusCode);
                }
                break;
        }

    }

    /**
     * 请求失败
     *
     * @param requestCode  请求链接 code
     * @param errorNo      请求网络失败 code 如404等
     * @param errorMessage 请求网络错误信息
     */
    @Override
    public void onRequestFaild(int requestCode, String errorNo, String errorMessage) {
        switch (requestCode) {
            case CodeConst.LOGIN_IS_PERMISION://获取用户权限  是否游客身份 积分墙是否显示 广告是否显示 1 是 0 否
                //不管成功与否都设置权限
                setPermisionPreference(loginDao.getUserInfo());
                try {
                    loginDao.bindJpushAlias();//绑定设备
                } catch (Exception e) {
                    goToHome();
                }
                break;

            case CodeConst.LOGIN_JPUSH_BIND://绑定设备
//                goToHome();
                break;

            case CodeConst.LOGIN_JPUSH_UNBIND://解绑设备
                Log.i(loginDao.statusCode);
                break;
            case CodeConst.LOGIN_VALIDATE_LOGIN://登录
                MessageUtils.showShortToast(LoginActivity.this,errorMessage);
                break;
        }
        setLoginBtnStatus(true);
    }

    @Override
    public void onNoConnect() {
        super.onNoConnect();
        setLoginBtnStatus(true);

    }

    /**
     * 进入应用是通过通知进入还是正常进入通知
     */
    private void goToHome() {

        //判断是否从推送通知点击进入
        //如果有推送通知,从通知进入应用
//        Intent i = new Intent(this, HomeActivity.class);
//        //从通知栏点击进入应用
//        if(getIntent().getBooleanExtra("isPushNotice",false))
//            i.putExtra("isPushNotice", getIntent().getBooleanExtra("isPushNotice",false));
//        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//它可以关掉所要到的界面中间的activity
//        startActivity(i);
//
//        Intent intent = new Intent(this, HomeActivity.class);
//        intent.putExtra("loginFlag", "isLogin");
//        setResult(Activity.RESULT_OK, intent);
        IntentUtil.intentSlidIn(this,HomeActivity.class,00);
        noAnimfinish();
//        AnimUtil.intentSlidIn(this);
    }

    /**
     * 存储服务器到本地
     */
    private void setServerPreference() {
        UserPreference.setServerPreference(nodeServerInfo);
    }

    /**
     * 存储用户信息到本地到本地
     */
    public void setUserPreference(UserInfo user) {
        user.setAccount(account);
        user.setPassword(pwd);
        UserPreference.setUserPreference(user);
    }

    /**
     * 存储用户权限到本地到本地
     */
    private void setPermisionPreference(UserInfo user) {
        UserPreference.setPermisionPreference(user);
    }


    //解除绑定
//    public static void logoutAlias(){
//        instance.setAlias(false);
//    }
    /**
     * 设置极光绑定设备别名
     */
    private void setAlias(boolean isBindAlias) {
        this.isBindAlias = isBindAlias;
        String alias = "";
        //1 为从设置界面点击退出进入登陆页面的,否则正常登陆
        if (isBindAlias) {
            String snsid = Arad.preferences.getString(LocalMark.SERVER_ID.getName());//服务器列表,节点 id
            String uid = Arad.preferences.getString(LocalMark.USER_UID.getName());//用户是Id
            alias = snsid + "_" + uid;
        }
        //调用JPush API设置Alias
        mHandler.sendMessage(mHandler.obtainMessage(1001, alias));
    }

    //极光设置别名回调
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1001:
                    android.util.Log.d("JPUSH", "Set alias in handler.");
                    JPushInterface.setAliasAndTags(getApplicationContext(), (String) msg.obj, null, mAliasCallback);
                    break;

                default:
                    android.util.Log.i("JPUSH", "Unhandled msg - " + msg.what);
            }
        }
    };
    /***
     * 设备绑定回调
     */
    private final TagAliasCallback mAliasCallback = new TagAliasCallback() {

        @Override
        public void gotResult(int code, String alias, Set<String> tags) {
            String logs;
            switch (code) {
                case 0:
                    logs = "Set tag and alias success";
                    android.util.Log.i("JPUSH", logs);


                    if (!isBindAlias) {
                        //调用解绑接口
                        loginDao.unBindJpushAlias();
                    } else {
                        loginDao.bindJpushAlias();//绑定我们自己的服务器接口
                    }
                    break;

                case 6002:
                    logs = "Failed to set alias and tags due to timeout. Try again after 30s.";
                    android.util.Log.i("JPUSH", logs);
                    if (ExampleUtil.isConnected(getApplicationContext())) {
                        mHandler.sendMessageDelayed(mHandler.obtainMessage(1001, alias), 1000 * 30);
                    } else {
                        android.util.Log.i("JPUSH", "No network");
                    }
                    break;

                default:
                    logs = "Failed with errorCode = " + code;
                    android.util.Log.e("JPUSH", logs);
            }

//            ExampleUtil.showToast(logs, getApplicationContext());
        }

    };

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_DOWN) {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                MessageUtils.showShortToast(this, "再按一次退出程序");
                exitTime = System.currentTimeMillis();
            } else {
                // 退出应用
                finish();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 格式化服务器列表
     * @return
     */
    private String[]  getServerListFormat(){
        String[] serverNameArray = new String[nodeServerLists.size()];

        for(int i = 0;i< nodeServerLists.size();i++){
            serverNameArray[i] = nodeServerLists.get(i).getSqmc();
        }
        return serverNameArray;
    }

    /**
     * 设置按钮状态
     * @param isClick 是否可点击
     */
    private void setLoginBtnStatus(boolean isClick){
        if(isClick){
            loginBtn.setText("登录");
            loginBtn.setEnabled(true);
        }else {
            loginBtn.setText("登录中");
            loginBtn.setEnabled(false);
        }
    }


}
